package com.google.code.lf.commons.xml.bind.adapter;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.xml.bind.annotation.adapters.XmlAdapter;

/**
 * Classe permettant de gérer les conversions de date en chaîne de caractères dans l'api <a href="https://jaxb.dev.java.net/">JAXB</a>.
 * 
 * @author gael.lorent-fonfrede
 */
public class XmlDateAdapter extends XmlAdapter<String, Date> {
	/** Formatteur de dates. */
	private static final DateFormat df = new SimpleDateFormat("d/M/yyyy");
	static {
		// Le parsing doit être strict pour rendre le format exact utilisé dans Grisbi
		df.setLenient(false);
	}

	/** Valeur de date <code>null</code> utilisée dans <a href="http://grisbi.org/">Grisbi</a>. */
	private static final String nullDate = "0/0/0";

	/* (non-Javadoc)
	 * @see javax.xml.bind.annotation.adapters.XmlAdapter#unmarshal(java.lang.Object)
	 */
	@Override
	public Date unmarshal(String date) throws Exception {
		if (nullDate.equalsIgnoreCase(date)) date = "0/0/0000";
		return df.parse(date);
	}

	/* (non-Javadoc)
	 * @see javax.xml.bind.annotation.adapters.XmlAdapter#marshal(java.lang.Object)
	 */
	@Override
	public String marshal(final Date date) throws Exception {
		if ((date == null) || (date.getTime() == 0)) return nullDate;
		return df.format(date);
	}
}
